<?php
/**
 * WidgetTemplate.class.php
 *
 * 用于完成对挂件视图文件(仅限html文件)的编译及加载工作
 * @author tommy <streen003@gmail.com>
 * @copyright  Copyright (c) 2010 Tommy Software Studio
 * @link http://www.doitphp.com
 * @license New BSD License.{@link http://www.opensource.org/licenses/bsd-license.php}
 * @version $Id: WidgetTemplate.class.php 1.0 2012-01-30 23:15:00Z tommy $
 * @package core
 * @since 1.0
 */

if (!defined('IN_DOIT')) {
    exit();
}

class WidgetTemplate extends Template {

    /**
     * widget的名称,默认为null
     *
     * @var string
     */
    public $widget;


    /**
     * 构造函数
     *
     * 初始化运行环境,或用于运行环境中基础变量的赋值
     * @access public
     * @return boolean;
     */
    public function __construct() {

        //定义视图目录及编译目录
        $this->view_dir    = WIDGET_DIR . 'views' . DIRECTORY_SEPARATOR;
        $this->compile_dir = CACHE_DIR . 'views/widgets' . DIRECTORY_SEPARATOR;
    }

    /**
     * 设置视图的主题
     *
     * @access public
     * @param string $theme_name 所要设置的网页模板主题名称
     * @return void
     */
    public function set_theme() {

    }

    /**
     * 设置视图文件布局结构的文件名(layout)
     *
     * layout默认为:main
     * @access public
     * @param string $layout_name     所要设置的layout名称
     * @return void
     */
    public function set_layout() {

    }

        /**
     * 加载局部视图
     *
     * @access protected
     * @param string $file_name      局部视图文件名
     * @return void
     */
    protected function render($file_name) {

    }

    /**
     * 分析视图缓存文件名
     *
     * @access protected
     * @param string $cache_id 缓存ID
     * @return string
     */
    protected function parse_cache_file($cache_id) {

        return CACHE_DIR . 'html/widgets/' . md5($cache_id) . '.widget.html';
    }

    /**
     * 分析视图缓存文件是否需要重新创建
     *
     * @access public
     * @param string $cache_id 缓存ID
     * @param integer $lifetime 缓存文件生存周期, 默认为一年
     * @return boolean
     */
    public function cache($cache_id = null, $lifetime = null) {

        //参数分析
        if (is_null($cache_id)) {
            $cache_id = $this->widget;
        }
        if (is_null($lifetime)) {
            //默认缓存生命周期为:一年
            $lifetime = 31536000;
        }

        //获取缓存文件
        $cache_file = $this->parse_cache_file($cache_id);
        if (is_file($cache_file) && (filemtime($cache_file) + $lifetime >= time())) {
            include $cache_file;
            exit();
        }

        $this->cache_status = true;
        $this->cache_file   = $cache_file;

        return true;
    }

    /**
     * 显示视图文件
     *
     * @access public
     * @param string $file_name    视图名
     * @return void
     */
    public function display($file_name = null) {

        //参数分析
        $file_name = is_null($file_name) ? $this->widget : $file_name;

        //分析视图变量
        if (!empty($this->_options)) {
            extract($this->_options, EXTR_PREFIX_SAME, 'data');
            //清空不必要的内存占用
            $this->_options = array();
        }

        //获取视图文件及编译文件
        $view_file      = $this->get_view_file($file_name);
        $compile_file   = $this->get_compile_file($file_name);

        //分析视图编译文件是否需要重新生成
        if ($this->is_compile($view_file, $compile_file)) {
            $view_content = $this->load_view_file($view_file);
            //重新生成编译缓存文件
            $this->create_compile_file($compile_file, $view_content);
        }

        //加载编译缓存文件
        ob_start();
        include $compile_file;
        $html_content = ob_get_clean();

        //显示视图内容
        echo $html_content;

        //创建视图缓存文件
        if ($this->cache_status == true) {
            $this->create_cache_file($this->cache_file, $html_content);
        }
    }

    /**
     * 单件模式调用方法
     *
     * @static
     * @var object
     */
     public static function getInstance(){

         if (!self::$_instance instanceof self) {
             self::$_instance = new self();
         }

        return self::$_instance;
    }
}